package com.atguigu.gmall.product;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author 李旭
 * @date 2022/1/10 15:16
 * @Description:
 *
 * 异步编排
 */
public class CompletableFutureDemo2 {

    public static void main(String[] args) throws Exception{
        ThreadPoolExecutor threadPoolExecutor =
                 new ThreadPoolExecutor(
                         5,
                         10,
                         5,
                         TimeUnit.SECONDS,
                         new ArrayBlockingQueue<>(10)
                 );

        //1:创建新的线程
/*        CompletableFuture.supplyAsync(() -> {
            System.out.println(Thread.currentThread().getName());
            //int i = 10/0;
            return "上一个任务";// 使用自定义线程池中线程执行上一个任务
        },threadPoolExecutor).whenComplete((t, u) -> {//计算完成时的回调方法  使用的是Main主线程完成当前任务
            System.out.println("t:" + t);//上一个任务的返回值信息
            System.out.println(Thread.currentThread().getName() + ":当前任务");
            System.out.println("u:" + u);//上一个任务的异常信息
        });*/
//////////////////////////////////////////////////////////////////////////////////////
        //1:创建新的线程
       CompletableFuture.supplyAsync(() -> {
            System.out.println(Thread.currentThread().getName());
            //int i = 10/0;
            return "上一个任务";// 使用自定义线程池中线程执行上一个任务
        },threadPoolExecutor).whenCompleteAsync((t, u) -> {//计算完成时的回调方法
            System.out.println("t:" + t);//上一个任务的返回值信息
            System.out.println(Thread.currentThread().getName() + ":当前任务");
            System.out.println("u:" + u);//上一个任务的异常信息
        },threadPoolExecutor).exceptionally(u -> {
           System.out.println("u:" + u);//上一个任务的异常信息
           System.out.println(Thread.currentThread().getName() + ":下一个任务");//有异常是主线程执行
           return "返回值";
       });

       //无异常
//        pool-1-thread-1
//        t:上一个任务
//        pool-1-thread-2:当前任务
//        u:null

        //有异常
//        pool-1-thread-1
//        t:null
//        pool-1-thread-2:当前任务
//        u:java.util.concurrent.CompletionException: java.lang.ArithmeticException: / by zero
//        u:java.util.concurrent.CompletionException: java.lang.ArithmeticException: / by zero
//        main:下一个任务
    }

    public static void main8(String[] args) throws InterruptedException {
        //向下转型测试
//        Student student = new Student("hhe");
//        student.setAge(18);
//        Person person=student;
//        Student ss=(Student)person;
//        System.out.println(ss);


//        RLock lock = redissonClient.getLock("");
//        lock.lock();

    }
}
